// Return the set of existing folders found at the end of the // chain of the "path" represented by this FolderName. If no such // folders exist, return an empty list. public async Task <List <Folder> > ResolveLeafFolders( DriveService service, Action <string> feedback) { // Find all folders named m_name, whose parents are in the // ParentFolderName list. For each folder found, add a folder // object to the list, then invoke this method on ChildFolderName. Folders.Clear(); List <Folder> parentFolders; if (ParentFolderName != null) { parentFolders = ParentFolderName.Folders; } else { parentFolders = new List <Folder>() { Folder.RootFolder }; } if (feedback != null) { string status = Resources.GetFormat( "Msg_RetrievingFolderFmt", m_name); feedback(status); } foreach (Folder parent in parentFolders) { FilesResource.ListRequest req = service.Files.List(); req.Q = "mimeType='" + GdsDefs.MimeTypeFolder + "' and name='" + m_name.QueryGdriveObjectName() + "' and '" + parent.DriveEntry.Id + "' in parents and trashed=false"; FileList appFolders = await req.ExecuteAsync(); foreach (GDriveFile entry in appFolders.Files) { Folders.Add(new Folder(this, parent, entry)); } } if (Folders.Any() && ChildFolderName != null) { return(await ChildFolderName.ResolveLeafFolders(service, feedback)); } return(Folders); }
// Return this FolderName or the first of its successors that does not // have folders. Used to find an existing partial path after // ResolveLeafFolders returns an empty list. Assuming // ResolveLeafFolders has been called, the return value's // ParentFolderName property value is either null (root), or an // instance whose Folders property contains at least one Folder. public FolderName FirstFolderNameWithoutFolders() { if (Folders.Any()) { if (ChildFolderName != null) { return(ChildFolderName.FirstFolderNameWithoutFolders()); } Debug.Fail( "All FolderNames have folders; ResolveLeafFolders failed"); throw new ApplicationException( "Expected empty folders in Target Folder chain."); } return(this); }
// Create a new folder hierarchy, parented by the first Folder in // the ParentFolderName link (or root if this is the top link). // The new hierarchy will be a set of nested folders, as modeled by // the "path" of the FolderName chain. // The top-most folder in the hierarchy will take the FolderName of // this link. Return the "leaf" Folder of the hierarchy. public async Task <Folder> CreateNewFolderPathFrom(Folder parent, DriveService service, Action <string> feedback ) { if (feedback != null) { string status = Resources.GetFormat( "Msg_CreatingFolderFmt", m_name); feedback(status); } GDriveFile folderMetadata = new GDriveFile() { Name = m_name, MimeType = GdsDefs.MimeTypeFolder }; if (parent != null) { folderMetadata.Parents = new List <string>() { parent.DriveEntry.Id }; } if (PluginConfig.Default.FolderColor != null) { folderMetadata.FolderColorRgb = PluginConfig.Default.FolderColor.HtmlHexString; } FilesResource.CreateRequest folderCreate; folderCreate = service.Files.Create(folderMetadata); folderCreate.Fields = "id"; Folder newFolder = new Folder(this, parent, await folderCreate.ExecuteAsync()); Folders.Add(newFolder); if (ChildFolderName != null) { return(await ChildFolderName .CreateNewFolderPathFrom(newFolder, service, feedback)); } return(newFolder); }