private IEnumerable <IOListing> LoadLocal(FilerArgs args)
        {
            var list = new List <IOListing>();

            if (!this.storageService.DirectoryExists(args.CurrentDirectory))
            {
                return(list);
            }

            list.AddRange(
                this.storageService
                .GetDirectoryNames(args.CurrentDirectory)
                .Select(dirName => new IOListing
            {
                FullPath    = args.CurrentDirectory + dirName + "/",
                Name        = dirName,
                IsDirectory = true,
                IsLocal     = true
            }));

            list.AddRange(
                this.storageService
                .GetFileNames(args.CurrentDirectory)
                .Select(fileName => new IOListing
            {
                FullPath    = args.CurrentDirectory + fileName,
                Name        = fileName,
                IsDirectory = false,
                IsLocal     = true
            }));

            return(list);
        }
        private async Task <IEnumerable <IOListing> > LoadRemoteAsync(FilerArgs args)
        {
            var list = await this.filerWebHandler.GetDirectoryListingAsync(args, this.ObtainCancellationToken());

            if (list == null)
            {
                throw new IOListingNullException("IOListing empty");
            }

            return(list);
        }
        public async Task Init(FilerArgs args)
        {
            this.Listings = new ObservableCollection <IOListing>();

            if (this.IsLoading)
            {
                return;
            }

            this.IsLoading = true;

            this.filerArgs = args;

            var loadLocalListing  = Task.Factory.StartNew(() => this.LoadLocal(args));
            var loadRemoteListing = this.LoadRemoteAsync(args);

            var results = await Task.Factory.ContinueWhenAll(new[] { loadLocalListing, loadRemoteListing }, tasks =>
            {
                var taskResults = new List <IEnumerable <IOListing> >();
                foreach (var task in tasks)
                {
                    if (task.IsFaulted)
                    {
                        this.logging.Exception(this, task.Exception);
                    }
                    else
                    {
                        taskResults.Add(task.Result);
                    }
                }

                return(taskResults);
            });

            var ordered = results.SelectMany(l => l)
                          .GroupBy(l => l.FullPath.ToLowerInvariant())
                          .Select(g => g.OrderByDescending(l => l.IsLocal).First()) // prefer IsLocal == true
                          .OrderByDescending(l => l.IsDirectory)
                          .ThenBy(l => l.Name);

            this.Listings   = new ObservableCollection <IOListing>(ordered);
            this.HasContent = this.Listings.Count > 0;

            this.IsLoading = false;
        }
 public override void Prepare(FilerArgs parameter)
 {
 }