Esempio n. 1
0
        public SupportPackageDataProvider([NotNull] IFileSystemEntry source, [CanBeNull] IReadOnlyCollection <ServerRole> roles, [CanBeNull] Action <string> logger)
        {
            Source = source;
            var packageFilePath = source.FullName;

            SourcePath = packageFilePath;
            FileName   = Path.GetFileName(packageFilePath);
            Roles      = roles;
            Logger     = logger;
            Assert.ArgumentNotNull(packageFilePath, nameof(packageFilePath));

            if (File.Exists(packageFilePath))
            {
                TempFolderPath = Path.GetTempFileName() + "dt";
                if (!Directory.Exists(TempFolderPath))
                {
                    Directory.CreateDirectory(TempFolderPath);
                }

                logger?.Invoke($"Unpacking {packageFilePath} to {TempFolderPath}");
                UnpackZip(packageFilePath, TempFolderPath);
            }
            else if (Directory.Exists(packageFilePath))
            {
                TempFolderPath = packageFilePath;
            }
            else
            {
                throw new InvalidOperationException("Neither file nor folder exists: " + packageFilePath);
            }
        }
Esempio n. 2
0
        private void RequestFiles(IFileSystemEntry entry)
        {
            if (!_machineAvailable)
            {
                return;
            }

            if (FolderMode)
            {
                return;
            }

            _entryFilter[entry] = GetSelectedFilter();

            List <FileSystemEntry> childEntries = ConnectionStore.Connections[Machine].ServiceHandler.Service
                                                  .GetFileSystemEntries(BuildPath(entry), _entryFilter[entry]).Select(x => x.FromDTO())
                                                  .Where(x => !x.IsFolder).OrderBy(x => x.Name).ToList();

            _entryTree.Where(x => x.Value == entry && !x.Key.IsFolder).ToList().ForEach(x => _entryTree.Remove(x));
            childEntries.ForEach(childEntry => _entryTree.Add(childEntry, entry));

            FileSystemTreeNode treeNode = _entryNodes[entry];

            treeNode.ChildEntries = treeNode.ChildEntries.Where(x => x.IsFolder).Concat(childEntries).ToList();
        }
Esempio n. 3
0
 internal void RemoveItem(IFileSystemEntry item)
 {
     if (myItems.ContainsKey(item.Path))
     {
         myItems.Remove(item.Path);
     }
 }
        public static IEnumerable<FileSystemEntryComparison> CompareTo(this IFileSystemEntry referenceEntry,
                                                                       IFileSystemEntry currentEntry)
        {
            var currentEntries = currentEntry.Traverse().ToList();
            var referenceEntries = referenceEntry.Traverse().ToList();

            foreach (var refEntry in referenceEntries)
            {
                if (currentEntries.Any(c =>
                {
                    _stringComparison = StringComparison.OrdinalIgnoreCase;
                    return c.Path.Equals(refEntry.Path, _stringComparison);
                }))
                {
                    yield return new FileSystemEntryComparison
                    {
                        Result = FileSystemEntryComparisonResult.Intact,
                        ReferenceFileSystemEntry = refEntry,
                        CurrentFileSystemEntries = currentEntries.Where(c => c.Path.Equals(refEntry.Path, _stringComparison))
                    };
                    continue;
                }

                var newLocations = currentEntries.Where(c => c.Name.Equals(refEntry.Name, _stringComparison)).ToList();

                if (newLocations.Any())
                {
                    yield return new FileSystemEntryComparison
                    {
                        Result = FileSystemEntryComparisonResult.Moved,
                        ReferenceFileSystemEntry = refEntry,
                        CurrentFileSystemEntries = newLocations
                    };
                    continue;
                }

                yield return new FileSystemEntryComparison
                {
                    Result = FileSystemEntryComparisonResult.Removed,
                    ReferenceFileSystemEntry = refEntry
                };
            }

            var addedEntries = currentEntries.Except(referenceEntries, new FileSystemEntryNameComparer()).ToList();

            if (addedEntries.Any())
            {
                foreach (var addedEntry in addedEntries)
                {
                    yield return new FileSystemEntryComparison
                    {
                        Result = FileSystemEntryComparisonResult.Added,
                        ReferenceFileSystemEntry = null,
                        CurrentFileSystemEntries = new List<IFileSystemEntry> { addedEntry }
                    };
                }
            }
        }
        private static void PrintingFilesAndDirectories(IFileSystemEntry fileSystemEntry, string prefix)
        {
            Console.WriteLine(prefix + fileSystemEntry.Name);

            foreach (var x in fileSystemEntry.Enteries)
            {
                PrintingFilesAndDirectories(x, prefix + "\t");
            }
        }
        public static IDirectory[] DecompressMegaPackage(IFileSystemEntry file, IDirectory extracted)
        {
            var files = extracted.GetFiles();

            if (files.Length > 2) // in mega there are collectionLog.html and optional index.html (SDT report included by SupportPackage.aspx)
            {
                return(new IDirectory[] { extracted });
            }

            var directories = extracted.GetDirectories();

            if (directories.Length == 0)
            {
                var zipFiles = extracted.GetFiles("*.zip");
                if (zipFiles.Length == 0)
                {
                    throw new InvalidOperationException("Mega package does not contain enither subfolders or inner zip files: " + file);
                }

                var newDirs = new List <IDirectory>();
                foreach (var zipFile in zipFiles)
                {
                    var newDir = extracted.GetChildDirectory(zipFile.NameWithoutExtension);
                    zipFile.ExtractZipToDirectory(newDir);
                    newDirs.Add(newDir);
                }

                directories = newDirs.ToArray();
            }

            // workaround for #197008 - we need to expand .link.link.link before .link.link and before .link
            var linkFiles = extracted.GetFiles("*.link", SearchOption.AllDirectories);

            if (linkFiles.Length == 0)
            {
                return(directories);
            }

            var depth = linkFiles.Max(x => GetDepth(x.Name));

            for (var i = depth; i > 0; --i)
            {
                var suffix = Enumerable.Repeat(".link", i).JoinToString("");

                foreach (var directory in directories)
                {
                    var links = directory.GetFiles("*" + suffix, SearchOption.AllDirectories);
                    foreach (var link in links)
                    {
                        TryExpandingLinkFile(link);
                    }
                }
            }

            return(directories);
        }
 private static IEnumerable<IFileSystemEntry> Traverse(this IFileSystemEntry root)
 {
     var stack = new Stack<IFileSystemEntry>();
     stack.Push(root);
     while (stack.Count > 0)
     {
         var current = stack.Pop();
         yield return current;
         foreach (var child in current.Children)
             stack.Push(child);
     }
 }
Esempio n. 8
0
        private string BuildPath(IFileSystemEntry entry)
        {
            string           path = entry.Name;
            IFileSystemEntry parentEntry;

            while (_entryTree.TryGetValue(entry, out parentEntry))
            {
                path  = Path.Combine(FixPath(parentEntry.Name), path);
                entry = parentEntry;
            }
            return(FixPath(path));
        }
Esempio n. 9
0
            public void Add(IFileSystemEntry entry, int priority = 0)
            {
                if (!entry.IsFolder)
                {
                    return;
                }

                lock (_lock)
                {
                    _queuedEntries.Add(new PrioritizedFileSystemEntry(entry, priority));
                    OrderQueue();
                }
            }
Esempio n. 10
0
 public void IncreasePriority(IFileSystemEntry entry, int priorityIncrement = 1)
 {
     lock (_lock)
     {
         PrioritizedFileSystemEntry prioritizedEntry = _queuedEntries.FirstOrDefault(x => x.Entry == entry);
         if (prioritizedEntry == null)
         {
             return;
         }
         prioritizedEntry.Priority += priorityIncrement;
         OrderQueue();
     }
 }
Esempio n. 11
0
        public IFile CopyTo(IFileSystemEntry dirOrFile, bool overwrite)
        {
            var target = dirOrFile.Path;

            if (dirOrFile is IDirectory)
            {
                target = System.IO.Path.Combine(dirOrFile.Path, Name);
            }

            File.Copy(Path, target, overwrite);

            return(FileSystem.File(target));
        }
Esempio n. 12
0
        /// <inheritdoc/>
        public async ValueTask PutFileAsync(IFileSystemEntry entry, CancellationToken cancellationToken = default)
        {
            var options = new BlobUploadOptions
            {
                HttpHeaders = new BlobHttpHeaders
                {
                    ContentType = entry.ContentType,
                }
            };

            // TODO: Check file size limit here.
            using Stream stream = await entry.CreateReadStreamAsync();

            _ = await this.container.GetBlobClient(entry.Name).UploadAsync(stream, options, cancellationToken);
        }
Esempio n. 13
0
        private void WriteFileSystemEntry(IFileSystemEntry entry)
        {
            switch (entry)
            {
            case FileModel model:
                fileRepository.WriteFile(model);
                return;

            case DirectoryModel model:
                directoryRepository.WriteDirectory(model);
                return;

            default:
                throw new NotImplementedException($"Unsupported FileSystemEntry type: {entry}");
            }
        }
        /// <inheritdoc/>
        public async Task <IImageResolver> GetAsync(HttpContext context)
        {
            if (!Udi.TryParse(context.Request.Host + context.Request.Path, out Udi udi) ||
                udi.EntityType != Constants.UdiEntityTypes.MediaFile ||
                udi.EntityType.Type != UdiType.ClosedString)
            {
                return(null);
            }

            IFileSystemEntry file = await this.fileSystem.GetFileAsync(udi.Id, default);

            if (file is null)
            {
                return(null);
            }

            return(new FileSystemImageResolver(file));
        }
Esempio n. 15
0
        public bool TryGetEntry(string name, out IFileSystemEntry entry)
        {
            if (isDisposed)
            {
                throw new ObjectDisposedException(nameof(DirectoryEntry));
            }

            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentException("Value cannot be null or whitespace.", nameof(name));
            }

            entry = directory.GetDirectoryEntries()
                    .Where(x => x.Name == name)
                    .Select(x => new FileSystemEntry(x))
                    .FirstOrDefault();
            return(entry != null);
        }
Esempio n. 16
0
        public void QuickSortFullTest()
        {
            FileSystemManager        manager           = FileSystemManager.Get();
            CancellationToken        cancellationToken = new();
            IList <IFileSystemEntry> entries           = new List <IFileSystemEntry>();
            string path = @"C:\Users\julie\Documents";

            manager.GetFileSystemEntries(path, cancellationToken, entries, (IList <IFileSystemEntry> list, IFileSystemEntry entry) => { list.Add(entry); });

            IFileSystemEntry[] array = new IFileSystemEntry[entries.Count];
            entries.CopyTo(array, 0);

            QuickSort.Sort(array, 0, array.Length - 1);

            for (int i = 0; i < array.Length - 1; i++)
            {
                Assert.IsFalse(array[i].CompareTo(array[i + 1]) > 0, nameof(array) + " is not sorted.");
            }
        }
Esempio n. 17
0
        private void GetFileSystemEntries(IFileSystemEntry rootDirectory)
        {
            var dirs = ListDirectories(rootDirectory);

            foreach (var dir in dirs)
            {
                rootDirectory.Children.Add(CreateDir(dir));
            }

            foreach (var file in Directory.GetFiles(rootDirectory.Path))
            {
                rootDirectory.Children.Add(CreateFile(file));
            }

            foreach (var dir in dirs)
            {
                GetFileSystemEntries(rootDirectory.Children.Single(c => c.Path == dir));
            }
        }
Esempio n. 18
0
        private async Task SendResponseAsync(
            IFileSystemEntry entry,
            MediaContext mediaContext,
            Stream stream,
            TimeSpan maxAge)
        {
            mediaContext.ComprehendRequestHeaders(entry.LastModifiedUtc, entry.ContentLength);

            switch (mediaContext.GetPreconditionState())
            {
            case MediaContext.PreconditionState.Unspecified:
            case MediaContext.PreconditionState.ShouldProcess:
                if (mediaContext.IsHeadRequest())
                {
                    await mediaContext.SendStatusAsync(ResponseConstants.Status200Ok, entry.ContentType, maxAge);

                    return;
                }

                this.logger.LogFileServed(mediaContext.GetDisplayUrl(), entry.Name);
                await mediaContext.SendAsync(stream, entry.ContentType, maxAge);

                return;

            case MediaContext.PreconditionState.NotModified:
                this.logger.LogFileNotModified(mediaContext.GetDisplayUrl());
                await mediaContext.SendStatusAsync(ResponseConstants.Status304NotModified, entry.ContentType, maxAge);

                return;

            case MediaContext.PreconditionState.PreconditionFailed:
                this.logger.LogFilePreconditionFailed(mediaContext.GetDisplayUrl());
                await mediaContext.SendStatusAsync(ResponseConstants.Status412PreconditionFailed, entry.ContentType, maxAge);

                return;

            default:
                var exception = new NotImplementedException(mediaContext.GetPreconditionState().ToString());
                Debug.Fail(exception.ToString());
                throw exception;
            }
        }
Esempio n. 19
0
        /// <inheritdoc/>
        public async ValueTask PutFileAsync(IFileSystemEntry entry, CancellationToken cancellationToken = default)
        {
            if (cancellationToken.IsCancellationRequested)
            {
                await ValueTaskEx.FromCanceled(cancellationToken);
            }

            string name      = entry.Name;
            string path      = Path.Combine(this.root, ToFilePath(name));
            string directory = Path.GetDirectoryName(path);

            if (!Directory.Exists(directory))
            {
                Directory.CreateDirectory(directory);
            }

            using Stream stream = await entry.CreateReadStreamAsync();

            using FileStream fileStream = File.Create(path);
            await stream.CopyToAsync(fileStream, cancellationToken);
        }
Esempio n. 20
0
 public ResourceEntry(int resourceId, IFileSystemEntry fileSystemEntry)
 {
     ResourceId = resourceId;
     if (fileSystemEntry != null)
     {
         IsDirectory = fileSystemEntry.IsDirectory;
         Name        = fileSystemEntry.Name;
         if (!IsDirectory)
         {
             using (Stream stream = fileSystemEntry.OpenStream())
             {
                 CopyStream(stream);
             }
         }
     }
     else
     {
         Name        = null;
         IsDirectory = true;
     }
 }
Esempio n. 21
0
        // checks if item belongs to this directory recursively
        private bool ItemIsChild(IFileSystemEntry item)
        {
            if (!item.Path.StartsWith(Path, StringComparison.OrdinalIgnoreCase))
            {
                return(false);
            }

            var itemParent = item.Parent;

            while (itemParent != null)
            {
                if (Equals(itemParent))
                {
                    return(true);
                }

                itemParent = itemParent.Parent;
            }

            return(false);
        }
Esempio n. 22
0
        public IFile CopyTo(IFileSystemEntry dirOrFile, bool overwrite)
        {
            var directory = dirOrFile as IDirectory;

            if (directory == null)
            {
                directory = ((IFile)dirOrFile).Parent;
            }

            if (!directory.Exists)
            {
                directory.Create();
            }

            var targetFile = (FileImpl)directory.File(Name);

            targetFile.CreateOnDemand();
            targetFile.myContent = new byte[myContent.Length];
            Array.Copy(myContent, targetFile.myContent, myContent.Length);

            return(targetFile);
        }
Esempio n. 23
0
        private void ListView_DoubleClick(object sender, EventArgs e)
        {
            if (listView.SelectedItems.Count != 1)
            {
                return;
            }

            IFileSystemEntry entry = ((FileSystemListViewItem)listView.SelectedItems[0]).Entry;

            if (entry.IsFolder)
            {
                FileSystemTreeNode treeNode = _entryNodes[entry];
                Task.Run(() => TaskActionWrapper.Do(() =>
                {
                    ExpandTreeNode(treeNode.Parent);
                    SelectTreeNode(treeNode);
                }));
            }
            else
            {
                buttonOK.PerformClick();
            }
        }
 public bool Equals(IFileSystemEntry other)
 {
     return(Equals(( object )other));
 }
Esempio n. 25
0
        public FileSystemEntryInfo(IFileSystemEntry entry)
        {
            Name = entry.Name;
            VirtualPath = entry.VirtualPath;
            PublicUri = entry.PublicUri;
            IsDirectory = entry is IDirectory;

            if (!IsDirectory)
            {
                Length = ((IFile)entry).Length;
            }
        }
Esempio n. 26
0
 private static string[] ListDirectories(IFileSystemEntry rootDirectory)
 {
     return(Directory.GetDirectories(rootDirectory.Path));
 }
Esempio n. 27
0
 public PrioritizedFileSystemEntry(IFileSystemEntry entry, int priority)
 {
     Entry    = entry;
     Priority = priority;
 }
Esempio n. 28
0
        public static bool IsChownPermissionsOk(this IFileSystemEntry entry, uint newUID, uint newGID)
        {
            var userUID = Syscall.getuid();

            return(userUID == 0 || (entry.UID == newUID && (entry.GID == newGID || userUID == entry.UID)));
        }
Esempio n. 29
0
 internal void RemoveItem( IFileSystemEntry item )
 {
     if( myItems.ContainsKey( item.Path ) )
     {
         myItems.Remove( item.Path );
     }
 }
Esempio n. 30
0
 internal void AddItem( IFileSystemEntry item )
 {
     myItems[ item.Path ] = item;
 }
 public static int CountAllEntries(this IFileSystemEntry listOfEntries)
 {
     return listOfEntries.Traverse().Count();
 }
Esempio n. 32
0
 internal void AddItem(IFileSystemEntry item)
 {
     myItems[item.Path] = item;
 }
Esempio n. 33
0
 /// <summary>Constructor.</summary>
 /// <param name="item"><see cref="IFileSystemEntry"/> to decorate</param>
 public FileSystemEntryViewModel(IFileSystemEntry item)
 {
     pathItem              = item;
     item.PropertyChanged += OnItemPropertyChanged;
 }
Esempio n. 34
0
 public bool Equals(IFileSystemEntry entry)
 {
     return this.FileSystemPath.Equals(entry.FileSystemPath);
 }