示例#1
0
        public async Task <bool> RemoveAccount(AccountModelBase account)
        {
            var isRemoved = await RemoveAccountAsync(account);

            if (isRemoved)
            {
                var handler = AccountRemoved;
                if (handler != null)
                {
                    handler.Invoke(account);
                }
            }

            return(isRemoved);
        }
示例#2
0
        public async Task <AccountModelBase> AddAccount(AccountModelBase account)
        {
            account = await AddAccountAsync(account);

            if (account != null)
            {
                var handler = AccountAdded;
                if (handler != null)
                {
                    handler.Invoke(account);
                }
            }

            return(account);
        }
示例#3
0
        protected void AddToCache(AccountModelBase account, DirectoryModel directory)
        {
            if (directory == null)
            {
                throw new ArgumentNullException(nameof(directory));
            }

            var hash = account.GetHashCode();

            if (!string.IsNullOrEmpty(directory.Path))
            {
                hash += directory.Path.GetHashCode();
            }

            Cache.Set(hash, directory);
        }
示例#4
0
        protected DirectoryModel GetFromCache(AccountModelBase account, DirectoryModel directory)
        {
            var hash = account.GetHashCode();

            if (directory != null)
            {
                hash += directory.GetHashCode();
            }

            if (Cache.TryGetValue(hash, out DirectoryModel dir))
            {
                return(dir);
            }

            return(null);
        }
示例#5
0
        protected override async Task <AccountModelBase> AddAccountAsync(AccountModelBase account = null)
        {
            var ftpAccount = account as AccountModel;

            using (var connection = await GetConnection(ftpAccount))
            {
                if (!connection.IsConnected)
                {
                    return(null);
                }

                await connection.DisconnectAsync();

                var config = GetConfiguration <ConfigModel>();
                config.Accounts.Add(ftpAccount);
                SetConfiguration(config);

                return(ftpAccount);
            }
        }
示例#6
0
        public override async Task <DirectoryModel> GetDirectoryAsync(AccountModelBase account, DirectoryModel directory = null)
        {
            var model = Task.FromResult(new DirectoryModel());

            return(await model);
        }
示例#7
0
        public override async Task <DirectoryModel> GetDirectoryAsync(AccountModelBase account, DirectoryModel directory = null)
        {
            var model = GetFromCache(account, directory);

            if (model != null)
            {
                return(model);
            }
            else
            {
                model      = new DirectoryModel();
                model.Path = "/";
            }

            var path = directory == null || string.IsNullOrEmpty(directory.Path) ? "/" : directory.Path;

            model.Name        = directory.Name;
            model.Path        = path;
            model.Directories = new List <DirectoryModel>();
            model.Files       = new List <FileModel>();

            using (var client = await GetConnection(account as AccountModel))
            {
                var entries = await client.GetListingAsync(path, FtpListOption.AllFiles);

                foreach (var entry in entries)
                {
                    switch (entry.Type)
                    {
                    case FtpFileSystemObjectType.Directory:
                        var dir = new DirectoryModel();
                        dir.Id       = entry.FullName.GetHashCode().ToString();
                        dir.Name     = entry.Name;
                        dir.Path     = entry.FullName;
                        dir.Size     = entry.Size;
                        dir.Created  = entry.Created;
                        dir.Modified = entry.Modified;
                        model.Directories.Add(dir);
                        break;

                    case FtpFileSystemObjectType.File:
                        var file = new FileModel();
                        file.Id       = entry.FullName.GetHashCode().ToString();
                        file.Name     = entry.Name;
                        file.Path     = entry.FullName;
                        file.Size     = entry.Size;
                        file.Created  = entry.Created;
                        file.Modified = entry.Modified;
                        model.Files.Add(file);
                        break;
                    }
                }

                if (client.IsConnected)
                {
                    await client.DisconnectAsync();
                }
            }

            AddToCache(account, model);
            return(model);
        }
示例#8
0
        public override async Task <DirectoryModel> GetDirectoryAsync(AccountModelBase account, DirectoryModel directory = null)
        {
            var model = GetFromCache(account, directory);

            if (model != null)
            {
                return(model);
            }
            else
            {
                model = new DirectoryModel();
            }

            model.Name        = directory.Name;
            model.Path        = directory.Path;
            model.Directories = new List <DirectoryModel>();
            model.Files       = new List <FileModel>();

            var credentials = await GetCredential();

            var parent = directory == null || directory.Id == null ? "root" : directory.Id;

            var query = new StringBuilder();

            if (directory.Id == null)
            {
                query.Append(" and 'root' in parents");
            }
            else
            {
                query.Append(" and '' in parents");
            }

            FileList entries;

            using (var client = new DriveService(GetServiceInitializer(credentials)))
            {
                var request = client.Files.List();
                request.Q        = string.Format("trashed = false and '{0}' in parents", parent);
                request.PageSize = Config.PageSize;
                request.Fields   = "nextPageToken, files(id, name, mimeType, parents, createdTime, modifiedTime, fileExtension, size)";

                entries = await request.ExecuteAsync();

                while (entries.Files != null)
                {
                    foreach (var entry in entries.Files)
                    {
                        var parents = entry.Parents;
                        if (entry.MimeType.Equals(MIME_TYPE_DIRECTORY))
                        {
                            var dir = new DirectoryModel();
                            dir.Id       = entry.Id;
                            dir.Name     = entry.Name;
                            dir.Path     = entry.Name;
                            dir.Size     = entry.Size;
                            dir.Created  = entry.CreatedTime;
                            dir.Modified = entry.ModifiedTime;
                            model.Directories.Add(dir);
                        }
                        else
                        {
                            var nameParts = SplitName(entry.Name);

                            var file = new FileModel();
                            file.Id        = entry.Id;
                            file.Name      = nameParts.Name;
                            file.Extension = nameParts.Extension;
                            file.Path      = entry.Name;
                            file.Size      = entry.Size;
                            file.Created   = entry.CreatedTime;
                            file.Modified  = entry.ModifiedTime;
                            model.Files.Add(file);
                        }
                    }

                    if (entries.NextPageToken == null)
                    {
                        break;
                    }

                    request.PageToken = entries.NextPageToken;
                    entries           = await request.ExecuteAsync();
                }
            }


            AddToCache(account, model);
            return(model);
        }
示例#9
0
        public override async Task <DirectoryModel> GetDirectoryAsync(AccountModelBase account, DirectoryModel directory = null)
        {
            var model = GetFromCache(account, directory);

            if (model != null)
            {
                return(model);
            }

            return(await Task.Run(() =>
            {
                model = new DirectoryModel();

                if (string.IsNullOrEmpty(directory.Path))
                {
                    model.Directories = new List <DirectoryModel>();
                    foreach (var driveInfo in DriveInfo.GetDrives())
                    {
                        if (!driveInfo.IsReady)
                        {
                            continue;
                        }

                        var drive = new DirectoryModel(true);
                        drive.Name = driveInfo.Name;
                        drive.Path = driveInfo.RootDirectory.FullName;
                        drive.Size = driveInfo.TotalSize;
                        model.Directories.Add(drive);
                    }

                    AddToCache(account, model);
                    return model;
                }

                DirectoryInfo info = new DirectoryInfo(directory.Path);
                model.Name = info.Name;
                model.Path = info.FullName;
                model.Created = info.CreationTime;
                model.Modified = info.LastWriteTime;
                model.Accessed = info.LastAccessTime;
                model.IsHidden = info.Attributes.HasFlag(FileAttributes.Hidden);
                model.IsSystem = info.Attributes.HasFlag(FileAttributes.System);

                model.Files = new List <FileModel>();
                try
                {
                    foreach (var fileInfo in info.GetFiles())
                    {
                        var file = new FileModel();
                        if (string.IsNullOrEmpty(fileInfo.Extension))
                        {
                            file.Name = fileInfo.Name;
                        }
                        else
                        {
                            file.Name = fileInfo.Name.Replace(fileInfo.Extension, string.Empty);
                            file.Extension = fileInfo.Extension.Substring(1).ToLowerInvariant();
                        }
                        file.Path = fileInfo.FullName;
                        file.Size = fileInfo.Length;
                        file.Created = fileInfo.CreationTime;
                        file.Modified = fileInfo.LastWriteTime;
                        file.Accessed = fileInfo.LastAccessTime;
                        file.IsHidden = fileInfo.Attributes.HasFlag(FileAttributes.Hidden);
                        file.IsSystem = fileInfo.Attributes.HasFlag(FileAttributes.System);
                        model.Files.Add(file);
                    }
                }
                catch (UnauthorizedAccessException)
                {
                }

                model.Directories = new List <DirectoryModel>();
                try
                {
                    foreach (var directoryInfo in info.GetDirectories())
                    {
                        var dir = new DirectoryModel();
                        dir.Name = directoryInfo.Name;
                        dir.Path = directoryInfo.FullName;
                        dir.Created = directoryInfo.CreationTime;
                        dir.Modified = directoryInfo.LastWriteTime;
                        dir.Accessed = directoryInfo.LastAccessTime;
                        dir.IsHidden = directoryInfo.Attributes.HasFlag(FileAttributes.Hidden);
                        dir.IsSystem = directoryInfo.Attributes.HasFlag(FileAttributes.System);
                        model.Directories.Add(dir);
                    }
                }
                catch (UnauthorizedAccessException)
                {
                }

                AddToCache(account, model);
                return model;
            }));
        }
示例#10
0
 protected override Task <bool> RemoveAccountAsync(AccountModelBase account)
 {
     throw new NotImplementedException();
 }
示例#11
0
 public abstract Task FormatAsync(AccountModelBase account, DirectoryModel directory = null);
示例#12
0
 public abstract Task <DirectoryModel> GetDirectoryAsync(AccountModelBase account, DirectoryModel directory = null);
示例#13
0
 protected abstract Task <bool> RemoveAccountAsync(AccountModelBase account);
示例#14
0
 protected abstract Task <AccountModelBase> AddAccountAsync(AccountModelBase account = null);
示例#15
0
        protected override async Task <AccountModelBase> AddAccountAsync(AccountModelBase account = null)
        {
            var provider = new AccountModel("aps", "aprs");

            return(await Task.FromResult(provider));
        }
示例#16
0
 public override Task FormatAsync(AccountModelBase account, DirectoryModel directory = null)
 {
     throw new NotImplementedException();
 }
示例#17
0
 protected override Task <AccountModelBase> AddAccountAsync(AccountModelBase account = null)
 {
     throw new NotImplementedException();
 }