예제 #1
0
        static private void scanRemoteFolder(OneDriveClient odc, Item dirItem, string relRemoteFolder)
        {
            FileHistory fh;

            if (!testFilePattern(relRemoteFolder, false))
            {
                return;
            }

            fh = setRemoteFileEntry(relRemoteFolder, dirItem);
            addLog(!fh.remoteChanged, string.Format("r\tVerzeichnis \"{0}\" ({1}, {2})", relRemoteFolder.Substring(config.Options.RemoteBaseDir.Length - 1), fh.remoteChanged ? "1" : "0", fh.remoteWriteTime.ToString()));

            IItemChildrenCollectionPage childs = odc.Drive.Items[dirItem.Id].Children.Request().GetAsync().Result;

            while (true)
            {
                foreach (Item remoteItem in childs)
                {
                    string relFullItemName = relRemoteFolder + remoteItem.Name;
                    if (remoteItem.Folder != null)
                    {
                        relFullItemName += "/";

                        scanRemoteFolder(odc, remoteItem, relFullItemName);
                    }
                    else if (remoteItem.File != null)
                    {
                        if (!testFilePattern(relFullItemName, false))
                        {
                            continue;
                        }

                        fh = setRemoteFileEntry(relFullItemName, remoteItem);
                        addLog(!fh.remoteChanged, string.Format("r\tDatei: \"{0}\" ({1}, {2}, {3})", remoteItem.Name, fh.remoteChanged ? "1" : "0", fh.remoteWriteTime.ToString(), fh.remote_cTag));
                    }
                    else
                    {
                        if (!testFilePattern(relFullItemName, false))
                        {
                            continue;
                        }

                        bool isOneNote = remoteItem.AdditionalData != null && remoteItem.AdditionalData["package"] != null &&
                                         remoteItem.AdditionalData["package"] is Newtonsoft.Json.Linq.JObject &&
                                         ((Newtonsoft.Json.Linq.JObject)remoteItem.AdditionalData["package"]).GetValue("type").ToString() == "oneNote";
                        addLog(false, "HINWEIS: Datei wird übersprungen: " + relRemoteFolder + remoteItem.Name + (isOneNote ? " (OneNote Datei kann nicht gesichert werden)" : " (Inhaltstyp unbekannt)"));
                    }
                }

                if (childs.NextPageRequest != null)
                {
                    childs = childs.NextPageRequest.GetAsync().Result;
                    continue;
                }
                break;
            }
        }
        private IEnumerable <T> ProcessResult(IItemChildrenCollectionPage oneDriveItems)
        {
            List <T> items = new List <T>(oneDriveItems.Count);

            foreach (var oneDriveItem in oneDriveItems)
            {
                T item = (T)CreateItem(oneDriveItem);
                items.Add(item);
            }

            return(items);
        }
        /// <inheritdoc/>
        public async Task <CloudFolder> GetAppFolderAsync()
        {
            ThrowIfNotConnected();

            var folder = await GetAppFolderItem().Request().GetAsync();

            var folderPath = "/drive/root:/Applications";

            if (folder.ParentReference != null)
            {
                folderPath = folder.ParentReference.Path;
            }

            IItemChildrenCollectionPage listFolder = null;
            var files = new List <CloudFile>();

            do
            {
                if (listFolder == null)
                {
                    listFolder = await _client.Drive.Items[folder.Id].Children.Request().GetAsync();
                }
                else
                {
                    listFolder = await listFolder.NextPageRequest.GetAsync();
                }

                foreach (var file in listFolder.CurrentPage.Where(entry => entry.File != null))
                {
                    files.Add(new CloudFile
                    {
                        Name     = file.Name,
                        FullPath = $"{file.ParentReference.Path}/{file.Name}",
                        LastModificationUtcDate = file.LastModifiedDateTime.GetValueOrDefault().DateTime
                    });
                }
            } while (listFolder.NextPageRequest != null);

            return(new CloudFolder
            {
                Name = folder.Name,
                Size = folder.Size,
                FullPath = $"{folderPath}/{folder.Name}/",
                Files = files
            });
        }
        /// <summary>
        /// Filter files
        /// </summary>
        /// <param name="itemFiles">Collection of DriveItem</param>
        /// <returns>A list of DriveItem</returns>
        private List <Item> QueryFiles(IItemChildrenCollectionPage itemFiles)
        {
            var query = from f in itemFiles.CurrentPage where f.File != null select f;

            return(query.ToList <Item>());
        }
        /// <summary>
        /// Filter folder
        /// </summary>
        /// <param name="itemFolders">Collection of DriveItem </param>
        /// <returns>Only the DriveItems folders </returns>
        private List <Item> QueryFolders(IItemChildrenCollectionPage itemFolders)
        {
            var query = from f in itemFolders.CurrentPage where f.Folder != null || f.SpecialFolder != null select f;

            return(query.ToList <Item>());
        }
예제 #6
0
        private async Task LoadOneDriveFoldersAsync()
        {
            if (_CancellationTokenSource != null)
            {
                //썸네일 로드 실행전 이전 요청을 취소시킴
                _CancellationTokenSource.Cancel();
            }

            if (_CancellationTokenSource == null || _CancellationTokenSource.IsCancellationRequested)
            {
                _CancellationTokenSource = new CancellationTokenSource();
            }

            _CurrentSubtitleFileList = null;

            //모든 자식 요소 삭제
            NetworkItemGroupSource.Clear();
            //로딩 표시
            IsLoadingFolders = true;
            IsLoadingFiles   = true;

            var folderGroupName = ResourceLoader.GetForCurrentView().GetString("List/Folder/Text");
            var fileGroupName   = ResourceLoader.GetForCurrentView().GetString("List/File/Text");
            var isOrderByName   = _Sort == SortType.Name || _Sort == SortType.NameDescending;

            string path = string.Join("/", pathStack.Select(x => x.Name).Reverse());

            //경로를 타이틀 영역에 표시
            DisplayCurrentPath = path;

            await ThreadPool.RunAsync(async handler =>
            {
                try
                {
                    IItemChildrenCollectionPage page = null;
                    //var suffixed = MediaFileSuffixes.VIDEO_SUFFIX.Union(MediaFileSuffixes.CLOSED_CAPTION_SUFFIX);
                    //var endswithFilter = string.Join(" or ", suffixed.Select(s => $"endswith(name, '{s}')"));
                    var filterString = "folder ne null or (file ne null and image eq null and audio eq null)";
                    var sortString   = _Sort == SortType.Name ? "name" : _Sort == SortType.NameDescending ? "name desc" : _Sort == SortType.CreatedDate ? "lastModifiedDateTime" : "lastModifiedDateTime desc";


                    if (pathStack.Any())
                    {
                        //var itemRequest = OneDriveClient.Drive.Items[networkItem.Id].Children.Request();// new List<Option> { new QueryOption("filter", "folder ne null or video ne null or (file ne null and image eq null and audio eq null)") });
                        var itemRequest = OneDriveClient.Drive.Root.ItemWithPath(path).Children.Request();
                        page            = await itemRequest.Filter(filterString)
                                          .Expand("thumbnails(select=medium)")
                                          .OrderBy(sortString)
                                          .GetAsync();
                    }
                    else
                    {
                        var itemRequest = OneDriveClient.Drive.Root.Children.Request();//.Expand("thumbnails,children(expand=thumbnails)");
                        page            = await itemRequest.Filter(filterString)
                                          .Expand("thumbnails(select=medium)")
                                          .OrderBy(sortString)
                                          .GetAsync();
                    }

                    //상위 버튼 및 하드웨어 백버튼 변경 처리
                    ChangeToUpperAndBackButton();

                    _ThumbnailListInCurrentFolder.Clear();
                    //기간 지난 썸네일 캐시 삭제
                    ThumbnailDAO.DeletePastPeriodThumbnail(Settings.Thumbnail.RetentionPeriod);
                    //썸네일 캐시 (이미지 바이트 데이터 제외)를 로드
                    LoadThumbnailMetadataInFolder(page.CurrentPage);

                    var ffList     = page.CurrentPage.Select(x => x.ToNetworkItemInfo(NetworkItemTapped, NetworkItemRightTapped, NetworkItemHolding, isOrderByName));
                    var folderList = ffList.Where(x => !x.IsFile).ToList();
                    await LoadBatchOneDriveFolderAsync(folderList, folderGroupName);
                    await GalaSoft.MvvmLight.Threading.DispatcherHelper.RunAsync(() => IsLoadingFolders = false);

                    var fileList = ffList.Where(x => x.IsFile).ToList();
                    await LoadBatchOneDriveFilesAsync(fileList, fileGroupName);
                    await GalaSoft.MvvmLight.Threading.DispatcherHelper.RunAsync(() => IsLoadingFiles = false);

                    //페이징 처리
                    await Task.Factory.StartNew(async() =>
                    {
                        //폴더 로딩 표시기 시작
                        await GalaSoft.MvvmLight.Threading.DispatcherHelper.RunAsync(() => { IsLoadingFolders = true; IsLoadingFiles = true; });
                        while (page.NextPageRequest != null)
                        {
                            //다음 페이지 패치
                            page = await page.NextPageRequest.GetAsync();

                            //썸네일 캐시 (이미지 바이트 데이터 제외)를 로드
                            LoadThumbnailMetadataInFolder(page.CurrentPage);

                            ffList     = page.CurrentPage.Select(x => x.ToNetworkItemInfo(NetworkItemTapped, NetworkItemRightTapped, NetworkItemHolding, isOrderByName));
                            folderList = ffList.Where(x => !x.IsFile).ToList();
                            await LoadBatchOneDriveFolderAsync(folderList, folderGroupName);

                            fileList = ffList.Where(x => x.IsFile).ToList();
                            await LoadBatchOneDriveFilesAsync(fileList, fileGroupName);
                        }

                        //폴더 로딩 표시기 정지
                        await GalaSoft.MvvmLight.Threading.DispatcherHelper.RunAsync(() => { IsLoadingFolders = false; IsLoadingFiles = false; });
                    });
                }
                catch (Exception)
                {
                    GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(async() =>
                    {
                        await DisconnectOneDriveServer(true);
                    });
                }
            });
        }